//package com.dfs.parent.gray.config;
//
//
//import com.dfs.parent.common.core.constant.GrayConstant;
//import com.dfs.parent.gray.rule.GrayRoundRobinLoadBalancer;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.cloud.client.ServiceInstance;
//import org.springframework.cloud.context.config.annotation.RefreshScope;
//import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
//import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
//import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
//import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
//import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Import;
//import org.springframework.core.env.Environment;
//
///**
// * @Description 灰度配置类
// *  在META-INF.spring目录文件org.springframework.boot.autoconfigure.AutoConfiguration.import下指定了GrayConfig.class
// * 有@Configuration报错Could not autowire. No beans of 'LoadBalancerClientFactory' type found.
// * 没有@Configuration 注解就是好的 这个是什么导致的 ？
// *
// * 在你的代码中，报错"Could not autowire. No beans of ‘LoadBalancerClientFactory’ type found."是因为在GrayConfig类上使用了@ConditionalOnBean(LoadBalancerClientFactory.class)注解，
// * 表示只有当存在LoadBalancerClientFactory类型的Bean时，才会加载GrayConfig类。
// * 然而，根据你的描述，当在GrayConfig类上添加@Configuration注解时，出现了找不到LoadBalancerClientFactory类型的Bean的错误。这可能是由于以下原因导致的：
// * 依赖加载顺序问题：可能是因为LoadBalancerClientFactory的Bean还没有被加载，而GrayConfig类已经被加载并尝试使用了LoadBalancerClientFactory的Bean。
// * 配置类扫描问题：可能是因为LoadBalancerClientFactory的Bean定义不在GrayConfig类所在的包或子包下，导致无法被自动扫描到。
// * 为了解决这个问题，你可以尝试以下方法：
// * 确保LoadBalancerClientFactory的Bean定义在项目中可用，并且已经正确加载。可以检查你的项目的配置类或其他地方，确保LoadBalancerClientFactory的Bean已经被正确定义和加载。
// * 确保LoadBalancerClientFactory的Bean定义在GrayConfig类所在的包或子包下，以便能够被自动扫描到。如果不在同一个包或子包下，可以考虑使用@ComponentScan注解或在主配置类上添加@Import注解，手动导入LoadBalancerClientFactory的Bean。
// *
// * @Configuration
// * @Import({LoadBalancerClientFactory.class})
// * public class MyAppConfig {
// *     // 其他配置信息和Bean定义
// * }
// * 请确保以上步骤正确执行，并重新启动你的应用程序，以解决"Could not autowire. No beans of ‘LoadBalancerClientFactory’ type found."的问题。
// *
// *
// * 那为什么不加上@Configuration 就可以了呢?
// * 如果在移除@Configuration注解后问题解决了，可能是由于以下原因：
// * 扫描配置类的问题：@Configuration注解用于标记一个类为配置类，告诉Spring容器该类中包含了一些配置信息和Bean定义。当添加了@Configuration注解后，Spring会自动扫描和加载该配置类。如果该配置类所在的包或子包没有被正确扫描到，就无法加载其中的Bean定义。
// * 加载顺序问题：在Spring Boot中，自动配置类是通过@EnableAutoConfiguration注解和spring.factories文件进行自动加载的。当@EnableAutoConfiguration注解扫描到spring.factories文件中的自动配置类时，会根据条件进行自动配置。如果GrayConfig类中的条件不满足（如@ConditionalOnBean(LoadBalancerClientFactory.class)条件），那么该自动配置类就不会被加载。
// * 根据你的问题描述，可能是因为在没有@Configuration注解的情况下，GrayConfig类中的条件不满足，导致GrayConfig类不会被加载，进而避免了找不到LoadBalancerClientFactory类型的Bean的错误。
// * 为了解决这个问题，你可以尝试以下方法：
// * 确保LoadBalancerClientFactory的Bean定义在项目中可用，并且已经正确加载。可以检查你的项目的配置类或其他地方，确保LoadBalancerClientFactory的Bean已经被正确定义和加载。
// * 确保GrayConfig类所在的包或子包被正确扫描到。可以检查你的项目的包扫描配置，确保GrayConfig类所在的包或子包被包含在扫描范围内。
// * 请确保以上步骤正确执行，并重新启动你的应用程序，以确保LoadBalancerClientFactory的Bean正确加载，并根据需要加载GrayConfig类。
// *
// * @Author dahong
// * @Date 2024/2/22 05:56
// */
//
//@Configuration
//@Slf4j
//public class GrayLoadBalancerConfig {
//
//    @Bean
//    @RefreshScope
//    public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment
//            , LoadBalancerClientFactory loadBalancerClientFactory
//            , @Value("${dfs.gray.rule.enabled}") String isGray) {
//        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
//        log.info("====com.dfs.parent.gray.config GrayConfig.ReactorLoadBalancer isGray:{}",isGray);
//        if(GrayConstant.GRAY_TAG_VALUE_TRUE.equals(isGray)) {
//            return new GrayRoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
//        }else{
//            return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
//        }
//
//    }
//
//}
